﻿namespace MobileTrack.Web.Tests.ViewModels
{
    using System;
    using System.Linq;
    using System.Security.Principal;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using MobileTrack.Core;
    using MobileTrack.Core.Model;
    using MobileTrack.Web.ViewModels;
    using Moq;

    [TestClass]
    public class CelularViewModelFixture
    {
        [TestMethod]
        [ExpectedException(typeof(ArgumentNullException))]
        public void ShouldThrowIfCelularIsNull()
        {
            new CelularViewModel(null, new Mock<IPrincipal>().Object);
        }

        [TestMethod]
        [ExpectedException(typeof(ArgumentNullException))]
        public void ShouldThrowIfLoggedUserPrincipalIsNull()
        {
            new CelularViewModel(new Celular(), null);
        }

        [TestMethod]
        public void ShouldSetTheCorrectCommandsForAdministratorWhenEstadoIsPendiente()
        {
            var date = DateTime.Today;

            var celular = new Celular { Id = 10, Descripcion = "Description", Imei = null, FechaIngreso = date, Marca = new Marca { EsOperador = false, Nombre = "Samsung" } };
            celular.Seguimientos.Add(new Seguimiento { Id = 1, Estado = Estado.Dañado, Fecha = date, Comprobante = "123-456", Sucursal = new Sucursal { Nombre = "Suc1", Codigo = "Cod1" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 3, Estado = Estado.Pendiente, Fecha = date.AddDays(1), Comprobante = "654-321", Sucursal = new Sucursal { Nombre = "Suc3", Codigo = "Cod3" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 2, Estado = Estado.EnDeposito, Fecha = date.AddDays(1), Comprobante = "321-654", Sucursal = new Sucursal { Nombre = "Suc2", Codigo = "Cod2" } });

            var principalMock = new Mock<IPrincipal>(MockBehavior.Strict);
            principalMock.Setup(p => p.IsInRole(Constants.AdministradorRole)).Returns(true);

            var celularViewModel = new CelularViewModel(celular, principalMock.Object);

            Assert.AreEqual(celular.Id, celularViewModel.Id);
            Assert.AreEqual(celular.Imei, celularViewModel.Imei);
            Assert.IsTrue(string.IsNullOrWhiteSpace(celularViewModel.ImeiLink));
            Assert.AreEqual("Liberado", celularViewModel.Operador);
            Assert.AreEqual(celular.Descripcion, celularViewModel.Producto);
            Assert.AreEqual(celular.FechaIngreso.ToString("yyyy-MM-dd"), celularViewModel.Ingreso);
            Assert.AreEqual("<a href=\"#\" onclick=\"imeiDialog(10)\">IMEI</a>", celularViewModel.Comandos);

            var lastSeguimiento = celular.Seguimientos.ElementAt(1);

            Assert.AreEqual(lastSeguimiento.Comprobante, celularViewModel.Comprobante);
            Assert.AreEqual(ModelHelper.ToString(lastSeguimiento.Estado), celularViewModel.Estado);
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Nombre));
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Codigo));

            principalMock.VerifyAll();
        }

        [TestMethod]
        public void ShouldSetTheCorrectCommandsForAsocianteWhenEstadoIsPendiente()
        {
            var date = DateTime.Today;

            var celular = new Celular { Id = 10, Descripcion = "Description", Imei = null, FechaIngreso = date, Marca = new Marca { EsOperador = false, Nombre = "Samsung" } };
            celular.Seguimientos.Add(new Seguimiento { Id = 1, Estado = Estado.Dañado, Fecha = date, Comprobante = "123-456", Sucursal = new Sucursal { Nombre = "Suc1", Codigo = "Cod1" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 3, Estado = Estado.Pendiente, Fecha = date.AddDays(1), Comprobante = "654-321", Sucursal = new Sucursal { Nombre = "Suc3", Codigo = "Cod3" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 2, Estado = Estado.EnDeposito, Fecha = date.AddDays(1), Comprobante = "321-654", Sucursal = new Sucursal { Nombre = "Suc2", Codigo = "Cod2" } });

            var principalMock = new Mock<IPrincipal>(MockBehavior.Strict);
            principalMock.Setup(p => p.IsInRole(Constants.AdministradorRole)).Returns(false);
            principalMock.Setup(p => p.IsInRole(Constants.AsocianteRole)).Returns(true);

            var celularViewModel = new CelularViewModel(celular, principalMock.Object);

            Assert.AreEqual(celular.Id, celularViewModel.Id);
            Assert.AreEqual(celular.Imei, celularViewModel.Imei);
            Assert.IsTrue(string.IsNullOrWhiteSpace(celularViewModel.ImeiLink));
            Assert.AreEqual("Liberado", celularViewModel.Operador);
            Assert.AreEqual(celular.Descripcion, celularViewModel.Producto);
            Assert.AreEqual(celular.FechaIngreso.ToString("yyyy-MM-dd"), celularViewModel.Ingreso);
            Assert.AreEqual("<a href=\"#\" onclick=\"imeiDialog(10)\">IMEI</a>", celularViewModel.Comandos);

            var lastSeguimiento = celular.Seguimientos.ElementAt(1);

            Assert.AreEqual(lastSeguimiento.Comprobante, celularViewModel.Comprobante);
            Assert.AreEqual(ModelHelper.ToString(lastSeguimiento.Estado), celularViewModel.Estado);
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Nombre));
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Codigo));

            principalMock.VerifyAll();
        }

        [TestMethod]
        public void ShouldSetTheCorrectCommandsForAdministratorWhenEstadoIsEnDeposito()
        {
            var date = DateTime.Today;

            var celular = new Celular { Id = 10, Descripcion = "Description", Imei = 123456789912345, FechaIngreso = date, Marca = new Marca { EsOperador = true, Nombre = "Personal" } };
            celular.Seguimientos.Add(new Seguimiento { Id = 1, Estado = Estado.Dañado, Fecha = date, Comprobante = "123-456", Sucursal = new Sucursal { Nombre = "Suc1", Codigo = "Cod1" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 3, Estado = Estado.EnDeposito, Fecha = date.AddDays(1), Comprobante = "654-321", Sucursal = new Sucursal { Nombre = "Suc3", Codigo = "Cod3" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 2, Estado = Estado.Pendiente, Fecha = date.AddDays(1), Comprobante = "321-654", Sucursal = new Sucursal { Nombre = "Suc2", Codigo = "Cod2" } });

            var principalMock = new Mock<IPrincipal>(MockBehavior.Strict);
            principalMock.Setup(p => p.IsInRole(Constants.AdministradorRole)).Returns(true);

            var celularViewModel = new CelularViewModel(celular, principalMock.Object);

            Assert.AreEqual(celular.Id, celularViewModel.Id);
            Assert.AreEqual(celular.Imei, celularViewModel.Imei);
            Assert.AreEqual("<a href=\"Seguimientos?imei=123456789912345\">123456789912345</a>", celularViewModel.ImeiLink);
            Assert.AreEqual(celular.Marca.Nombre, celularViewModel.Operador);
            Assert.AreEqual(celular.Descripcion, celularViewModel.Producto);
            Assert.AreEqual(celular.FechaIngreso.ToString("yyyy-MM-dd"), celularViewModel.Ingreso);
            Assert.AreEqual("<a href=\"#\" onclick=\"sendImeiDialog(10)\">Envio</a>", celularViewModel.Comandos);

            var lastSeguimiento = celular.Seguimientos.ElementAt(1);

            Assert.AreEqual(lastSeguimiento.Comprobante, celularViewModel.Comprobante);
            Assert.AreEqual(ModelHelper.ToString(lastSeguimiento.Estado), celularViewModel.Estado);
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Nombre));
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Codigo));

            principalMock.VerifyAll();
        }

        [TestMethod]
        public void ShouldSetTheCorrectCommandsForDespachanteWhenEstadoIsEnDeposito()
        {
            var date = DateTime.Today;
            var lastSucursal = new Sucursal { Nombre = "Suc3", Codigo = "Cod3" };
            var sucursalRole = string.Concat(lastSucursal.Nombre, Constants.SucursalRoleSuffix);

            var celular = new Celular { Id = 10, Descripcion = "Description", Imei = 123456789912345, FechaIngreso = date, Marca = new Marca { EsOperador = true, Nombre = "Personal" } };
            celular.Seguimientos.Add(new Seguimiento { Id = 1, Estado = Estado.Dañado, Fecha = date, Comprobante = "123-456", Sucursal = new Sucursal { Nombre = "Suc1", Codigo = "Cod1" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 3, Estado = Estado.EnDeposito, Fecha = date.AddDays(1), Comprobante = "654-321", Sucursal = lastSucursal });
            celular.Seguimientos.Add(new Seguimiento { Id = 2, Estado = Estado.Pendiente, Fecha = date.AddDays(1), Comprobante = "321-654", Sucursal = new Sucursal { Nombre = "Suc2", Codigo = "Cod2" } });

            var principalMock = new Mock<IPrincipal>(MockBehavior.Strict);
            principalMock.Setup(p => p.IsInRole(Constants.AdministradorRole)).Returns(false);
            principalMock.Setup(p => p.IsInRole(Constants.DespachanteRole)).Returns(true);
            principalMock.Setup(p => p.IsInRole(sucursalRole)).Returns(true);

            var celularViewModel = new CelularViewModel(celular, principalMock.Object);

            Assert.AreEqual(celular.Id, celularViewModel.Id);
            Assert.AreEqual(celular.Imei, celularViewModel.Imei);
            Assert.AreEqual("<a href=\"Seguimientos?imei=123456789912345\">123456789912345</a>", celularViewModel.ImeiLink);
            Assert.AreEqual(celular.Marca.Nombre, celularViewModel.Operador);
            Assert.AreEqual(celular.Descripcion, celularViewModel.Producto);
            Assert.AreEqual(celular.FechaIngreso.ToString("yyyy-MM-dd"), celularViewModel.Ingreso);
            Assert.AreEqual("<a href=\"#\" onclick=\"sendImeiDialog(10)\">Envio</a>", celularViewModel.Comandos);

            var lastSeguimiento = celular.Seguimientos.ElementAt(1);

            Assert.AreEqual(lastSeguimiento.Comprobante, celularViewModel.Comprobante);
            Assert.AreEqual(ModelHelper.ToString(lastSeguimiento.Estado), celularViewModel.Estado);
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Nombre));
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Codigo));

            principalMock.VerifyAll();
        }

        [TestMethod]
        public void ShouldSetNoCommandsForDespachanteWhenEstadoIsEnDepositoAndItIsNotInHisSucursal()
        {
            var date = DateTime.Today;
            var lastSucursal = new Sucursal { Nombre = "Suc3", Codigo = "Cod3" };
            var sucursalRole = string.Concat(lastSucursal.Nombre, Constants.SucursalRoleSuffix);

            var celular = new Celular { Id = 10, Descripcion = "Description", Imei = 123456789912345, FechaIngreso = date, Marca = new Marca { EsOperador = true, Nombre = "Personal" } };
            celular.Seguimientos.Add(new Seguimiento { Id = 1, Estado = Estado.Dañado, Fecha = date, Comprobante = "123-456", Sucursal = new Sucursal { Nombre = "Suc1", Codigo = "Cod1" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 3, Estado = Estado.EnDeposito, Fecha = date.AddDays(1), Comprobante = "654-321", Sucursal = lastSucursal });
            celular.Seguimientos.Add(new Seguimiento { Id = 2, Estado = Estado.Pendiente, Fecha = date.AddDays(1), Comprobante = "321-654", Sucursal = new Sucursal { Nombre = "Suc2", Codigo = "Cod2" } });

            var principalMock = new Mock<IPrincipal>(MockBehavior.Strict);
            principalMock.Setup(p => p.IsInRole(Constants.AdministradorRole)).Returns(false);
            principalMock.Setup(p => p.IsInRole(Constants.DespachanteRole)).Returns(true);
            principalMock.Setup(p => p.IsInRole(sucursalRole)).Returns(false);

            var celularViewModel = new CelularViewModel(celular, principalMock.Object);

            Assert.AreEqual(celular.Id, celularViewModel.Id);
            Assert.AreEqual(celular.Imei, celularViewModel.Imei);
            Assert.AreEqual("<a href=\"Seguimientos?imei=123456789912345\">123456789912345</a>", celularViewModel.ImeiLink);
            Assert.AreEqual(celular.Marca.Nombre, celularViewModel.Operador);
            Assert.AreEqual(celular.Descripcion, celularViewModel.Producto);
            Assert.AreEqual(celular.FechaIngreso.ToString("yyyy-MM-dd"), celularViewModel.Ingreso);
            Assert.AreEqual(string.Empty, celularViewModel.Comandos);

            var lastSeguimiento = celular.Seguimientos.ElementAt(1);

            Assert.AreEqual(lastSeguimiento.Comprobante, celularViewModel.Comprobante);
            Assert.AreEqual(ModelHelper.ToString(lastSeguimiento.Estado), celularViewModel.Estado);
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Nombre));
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Codigo));

            principalMock.VerifyAll();
        }

        [TestMethod]
        public void ShouldSetNoCommandsWhenEstadoIsEnDeposito()
        {
            var date = DateTime.Today;

            var celular = new Celular { Id = 10, Descripcion = "Description", Imei = 123456789912345, FechaIngreso = date, Marca = new Marca { EsOperador = true, Nombre = "Personal" } };
            celular.Seguimientos.Add(new Seguimiento { Id = 1, Estado = Estado.Dañado, Fecha = date, Comprobante = "123-456", Sucursal = new Sucursal { Nombre = "Suc1", Codigo = "Cod1" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 3, Estado = Estado.EnDeposito, Fecha = date.AddDays(1), Comprobante = "654-321", Sucursal = new Sucursal { Nombre = "Suc3", Codigo = "Cod3" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 2, Estado = Estado.Pendiente, Fecha = date.AddDays(1), Comprobante = "321-654", Sucursal = new Sucursal { Nombre = "Suc2", Codigo = "Cod2" } });

            var principalMock = new Mock<IPrincipal>(MockBehavior.Strict);
            principalMock.Setup(p => p.IsInRole(Constants.AdministradorRole)).Returns(false);
            principalMock.Setup(p => p.IsInRole(Constants.DespachanteRole)).Returns(false);

            var celularViewModel = new CelularViewModel(celular, principalMock.Object);

            Assert.AreEqual(celular.Id, celularViewModel.Id);
            Assert.AreEqual(celular.Imei, celularViewModel.Imei);
            Assert.AreEqual("<a href=\"Seguimientos?imei=123456789912345\">123456789912345</a>", celularViewModel.ImeiLink);
            Assert.AreEqual(celular.Marca.Nombre, celularViewModel.Operador);
            Assert.AreEqual(celular.Descripcion, celularViewModel.Producto);
            Assert.AreEqual(celular.FechaIngreso.ToString("yyyy-MM-dd"), celularViewModel.Ingreso);
            Assert.AreEqual(string.Empty, celularViewModel.Comandos);

            var lastSeguimiento = celular.Seguimientos.ElementAt(1);

            Assert.AreEqual(lastSeguimiento.Comprobante, celularViewModel.Comprobante);
            Assert.AreEqual(ModelHelper.ToString(lastSeguimiento.Estado), celularViewModel.Estado);
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Nombre));
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Codigo));

            principalMock.VerifyAll();
        }

        [TestMethod]
        public void ShouldSetTheCorrectCommandsForAdministratorWhenEstadoIsEnTransito()
        {
            var date = DateTime.Today;

            var celular = new Celular { Id = 10, Descripcion = "Description", Imei = 123456789912345, FechaIngreso = date, Marca = new Marca { EsOperador = true, Nombre = "Personal" } };
            celular.Seguimientos.Add(new Seguimiento { Id = 1, Estado = Estado.Dañado, Fecha = date, Comprobante = "123-456", Sucursal = new Sucursal { Nombre = "Suc1", Codigo = "Cod1" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 3, Estado = Estado.EnTransito, Fecha = date.AddDays(1), Comprobante = "654-321", Sucursal = new Sucursal { Nombre = "Suc3", Codigo = "Cod3" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 2, Estado = Estado.Pendiente, Fecha = date.AddDays(1), Comprobante = "321-654", Sucursal = new Sucursal { Nombre = "Suc2", Codigo = "Cod2" } });

            var principalMock = new Mock<IPrincipal>(MockBehavior.Strict);
            principalMock.Setup(p => p.IsInRole(Constants.AdministradorRole)).Returns(true);

            var celularViewModel = new CelularViewModel(celular, principalMock.Object);

            Assert.AreEqual(celular.Id, celularViewModel.Id);
            Assert.AreEqual(celular.Imei, celularViewModel.Imei);
            Assert.AreEqual("<a href=\"Seguimientos?imei=123456789912345\">123456789912345</a>", celularViewModel.ImeiLink);
            Assert.AreEqual(celular.Marca.Nombre, celularViewModel.Operador);
            Assert.AreEqual(celular.Descripcion, celularViewModel.Producto);
            Assert.AreEqual(celular.FechaIngreso.ToString("yyyy-MM-dd"), celularViewModel.Ingreso);
            Assert.AreEqual("<a href=\"#\" onclick=\"receiveImeiDialog(10)\">Recepcion</a>", celularViewModel.Comandos);

            var lastSeguimiento = celular.Seguimientos.ElementAt(1);

            Assert.AreEqual(lastSeguimiento.Comprobante, celularViewModel.Comprobante);
            Assert.AreEqual(ModelHelper.ToString(lastSeguimiento.Estado), celularViewModel.Estado);
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Nombre));
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Codigo));

            principalMock.VerifyAll();
        }

        [TestMethod]
        public void ShouldSetTheCorrectCommandsForReceptorWhenEstadoIsEnTransito()
        {
            var date = DateTime.Today;
            var lastSucursal = new Sucursal { Nombre = "Suc3", Codigo = "Cod3" };
            var sucursalRole = string.Concat(lastSucursal.Nombre, Constants.SucursalRoleSuffix);

            var celular = new Celular { Id = 10, Descripcion = "Description", Imei = 123456789912345, FechaIngreso = date, Marca = new Marca { EsOperador = true, Nombre = "Personal" } };
            celular.Seguimientos.Add(new Seguimiento { Id = 1, Estado = Estado.Dañado, Fecha = date, Comprobante = "123-456", Sucursal = new Sucursal { Nombre = "Suc1", Codigo = "Cod1" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 3, Estado = Estado.EnTransito, Fecha = date.AddDays(1), Comprobante = "654-321", Sucursal = lastSucursal });
            celular.Seguimientos.Add(new Seguimiento { Id = 2, Estado = Estado.Pendiente, Fecha = date.AddDays(1), Comprobante = "321-654", Sucursal = new Sucursal { Nombre = "Suc2", Codigo = "Cod2" } });

            var principalMock = new Mock<IPrincipal>(MockBehavior.Strict);
            principalMock.Setup(p => p.IsInRole(Constants.AdministradorRole)).Returns(false);
            principalMock.Setup(p => p.IsInRole(Constants.ReceptorRole)).Returns(true);
            principalMock.Setup(p => p.IsInRole(sucursalRole)).Returns(true);

            var celularViewModel = new CelularViewModel(celular, principalMock.Object);

            Assert.AreEqual(celular.Id, celularViewModel.Id);
            Assert.AreEqual(celular.Imei, celularViewModel.Imei);
            Assert.AreEqual("<a href=\"Seguimientos?imei=123456789912345\">123456789912345</a>", celularViewModel.ImeiLink);
            Assert.AreEqual(celular.Marca.Nombre, celularViewModel.Operador);
            Assert.AreEqual(celular.Descripcion, celularViewModel.Producto);
            Assert.AreEqual(celular.FechaIngreso.ToString("yyyy-MM-dd"), celularViewModel.Ingreso);
            Assert.AreEqual("<a href=\"#\" onclick=\"receiveImeiDialog(10)\">Recepcion</a>", celularViewModel.Comandos);

            var lastSeguimiento = celular.Seguimientos.ElementAt(1);

            Assert.AreEqual(lastSeguimiento.Comprobante, celularViewModel.Comprobante);
            Assert.AreEqual(ModelHelper.ToString(lastSeguimiento.Estado), celularViewModel.Estado);
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Nombre));
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Codigo));

            principalMock.VerifyAll();
        }

        [TestMethod]
        public void ShouldSetNoCommandsForReceptorWhenEstadoIsEnTransitoAndItIsNotInHisSucursal()
        {
            var date = DateTime.Today;
            var lastSucursal = new Sucursal { Nombre = "Suc3", Codigo = "Cod3" };
            var sucursalRole = string.Concat(lastSucursal.Nombre, Constants.SucursalRoleSuffix);

            var celular = new Celular { Id = 10, Descripcion = "Description", Imei = 123456789912345, FechaIngreso = date, Marca = new Marca { EsOperador = true, Nombre = "Personal" } };
            celular.Seguimientos.Add(new Seguimiento { Id = 1, Estado = Estado.Dañado, Fecha = date, Comprobante = "123-456", Sucursal = new Sucursal { Nombre = "Suc1", Codigo = "Cod1" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 3, Estado = Estado.EnTransito, Fecha = date.AddDays(1), Comprobante = "654-321", Sucursal = lastSucursal });
            celular.Seguimientos.Add(new Seguimiento { Id = 2, Estado = Estado.Pendiente, Fecha = date.AddDays(1), Comprobante = "321-654", Sucursal = new Sucursal { Nombre = "Suc2", Codigo = "Cod2" } });

            var principalMock = new Mock<IPrincipal>(MockBehavior.Strict);
            principalMock.Setup(p => p.IsInRole(Constants.AdministradorRole)).Returns(false);
            principalMock.Setup(p => p.IsInRole(Constants.ReceptorRole)).Returns(true);
            principalMock.Setup(p => p.IsInRole(sucursalRole)).Returns(false);

            var celularViewModel = new CelularViewModel(celular, principalMock.Object);

            Assert.AreEqual(celular.Id, celularViewModel.Id);
            Assert.AreEqual(celular.Imei, celularViewModel.Imei);
            Assert.AreEqual("<a href=\"Seguimientos?imei=123456789912345\">123456789912345</a>", celularViewModel.ImeiLink);
            Assert.AreEqual(celular.Marca.Nombre, celularViewModel.Operador);
            Assert.AreEqual(celular.Descripcion, celularViewModel.Producto);
            Assert.AreEqual(celular.FechaIngreso.ToString("yyyy-MM-dd"), celularViewModel.Ingreso);
            Assert.AreEqual(string.Empty, celularViewModel.Comandos);

            var lastSeguimiento = celular.Seguimientos.ElementAt(1);

            Assert.AreEqual(lastSeguimiento.Comprobante, celularViewModel.Comprobante);
            Assert.AreEqual(ModelHelper.ToString(lastSeguimiento.Estado), celularViewModel.Estado);
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Nombre));
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Codigo));

            principalMock.VerifyAll();
        }

        [TestMethod]
        public void ShouldSetNoCommandsWhenEstadoIsEnTransito()
        {
            var date = DateTime.Today;

            var celular = new Celular { Id = 10, Descripcion = "Description", Imei = 123456789912345, FechaIngreso = date, Marca = new Marca { EsOperador = true, Nombre = "Personal" } };
            celular.Seguimientos.Add(new Seguimiento { Id = 1, Estado = Estado.Dañado, Fecha = date, Comprobante = "123-456", Sucursal = new Sucursal { Nombre = "Suc1", Codigo = "Cod1" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 3, Estado = Estado.EnTransito, Fecha = date.AddDays(1), Comprobante = "654-321", Sucursal = new Sucursal { Nombre = "Suc3", Codigo = "Cod3" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 2, Estado = Estado.Pendiente, Fecha = date.AddDays(1), Comprobante = "321-654", Sucursal = new Sucursal { Nombre = "Suc2", Codigo = "Cod2" } });

            var principalMock = new Mock<IPrincipal>(MockBehavior.Strict);
            principalMock.Setup(p => p.IsInRole(Constants.AdministradorRole)).Returns(false);
            principalMock.Setup(p => p.IsInRole(Constants.ReceptorRole)).Returns(false);

            var celularViewModel = new CelularViewModel(celular, principalMock.Object);

            Assert.AreEqual(celular.Id, celularViewModel.Id);
            Assert.AreEqual(celular.Imei, celularViewModel.Imei);
            Assert.AreEqual("<a href=\"Seguimientos?imei=123456789912345\">123456789912345</a>", celularViewModel.ImeiLink);
            Assert.AreEqual(celular.Marca.Nombre, celularViewModel.Operador);
            Assert.AreEqual(celular.Descripcion, celularViewModel.Producto);
            Assert.AreEqual(celular.FechaIngreso.ToString("yyyy-MM-dd"), celularViewModel.Ingreso);
            Assert.AreEqual(string.Empty, celularViewModel.Comandos);

            var lastSeguimiento = celular.Seguimientos.ElementAt(1);

            Assert.AreEqual(lastSeguimiento.Comprobante, celularViewModel.Comprobante);
            Assert.AreEqual(ModelHelper.ToString(lastSeguimiento.Estado), celularViewModel.Estado);
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Nombre));
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Codigo));

            principalMock.VerifyAll();
        }

        [TestMethod]
        public void ShouldSetTheCorrectCommandsForAdministratorWhenEstadoIsDisponibleVenta()
        {
            var date = DateTime.Today;

            var celular = new Celular { Id = 10, Descripcion = "Description", Imei = 123456789912345, FechaIngreso = date, Marca = new Marca { EsOperador = true, Nombre = "Personal" } };
            celular.Seguimientos.Add(new Seguimiento { Id = 1, Estado = Estado.Dañado, Fecha = date, Comprobante = "123-456", Sucursal = new Sucursal { Nombre = "Suc1", Codigo = "Cod1" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 3, Estado = Estado.DisponibleVenta, Fecha = date.AddDays(1), Comprobante = "654-321", Sucursal = new Sucursal { Nombre = "Suc3", Codigo = "Cod3" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 2, Estado = Estado.Pendiente, Fecha = date.AddDays(1), Comprobante = "321-654", Sucursal = new Sucursal { Nombre = "Suc2", Codigo = "Cod2" } });

            var principalMock = new Mock<IPrincipal>(MockBehavior.Strict);
            principalMock.Setup(p => p.IsInRole(Constants.AdministradorRole)).Returns(true);

            var celularViewModel = new CelularViewModel(celular, principalMock.Object);

            Assert.AreEqual(celular.Id, celularViewModel.Id);
            Assert.AreEqual(celular.Imei, celularViewModel.Imei);
            Assert.AreEqual("<a href=\"Seguimientos?imei=123456789912345\">123456789912345</a>", celularViewModel.ImeiLink);
            Assert.AreEqual(celular.Marca.Nombre, celularViewModel.Operador);
            Assert.AreEqual(celular.Descripcion, celularViewModel.Producto);
            Assert.AreEqual(celular.FechaIngreso.ToString("yyyy-MM-dd"), celularViewModel.Ingreso);
            Assert.AreEqual("<a href=\"#\" onclick=\"sendImeiDialog(10)\">Envio</a> | <a href=\"#\" onclick=\"sellImeiDialog(10)\">Venta</a>", celularViewModel.Comandos);

            var lastSeguimiento = celular.Seguimientos.ElementAt(1);

            Assert.AreEqual(lastSeguimiento.Comprobante, celularViewModel.Comprobante);
            Assert.AreEqual(ModelHelper.ToString(lastSeguimiento.Estado), celularViewModel.Estado);
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Nombre));
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Codigo));

            principalMock.VerifyAll();
        }

        [TestMethod]
        public void ShouldSetTheCorrectCommandsForDespachanteWhenEstadoIsDisponibleVenta()
        {
            var date = DateTime.Today;
            var lastSucursal = new Sucursal { Nombre = "Suc3", Codigo = "Cod3" };
            var sucursalRole = string.Concat(lastSucursal.Nombre, Constants.SucursalRoleSuffix);

            var celular = new Celular { Id = 10, Descripcion = "Description", Imei = 123456789912345, FechaIngreso = date, Marca = new Marca { EsOperador = true, Nombre = "Personal" } };
            celular.Seguimientos.Add(new Seguimiento { Id = 1, Estado = Estado.Dañado, Fecha = date, Comprobante = "123-456", Sucursal = new Sucursal { Nombre = "Suc1", Codigo = "Cod1" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 3, Estado = Estado.DisponibleVenta, Fecha = date.AddDays(1), Comprobante = "654-321", Sucursal = lastSucursal });
            celular.Seguimientos.Add(new Seguimiento { Id = 2, Estado = Estado.Pendiente, Fecha = date.AddDays(1), Comprobante = "321-654", Sucursal = new Sucursal { Nombre = "Suc2", Codigo = "Cod2" } });

            var principalMock = new Mock<IPrincipal>(MockBehavior.Strict);
            principalMock.Setup(p => p.IsInRole(Constants.AdministradorRole)).Returns(false);
            principalMock.Setup(p => p.IsInRole(Constants.DespachanteRole)).Returns(true);
            principalMock.Setup(p => p.IsInRole(Constants.VendedorRole)).Returns(false);
            principalMock.Setup(p => p.IsInRole(sucursalRole)).Returns(true);

            var celularViewModel = new CelularViewModel(celular, principalMock.Object);

            Assert.AreEqual(celular.Id, celularViewModel.Id);
            Assert.AreEqual(celular.Imei, celularViewModel.Imei);
            Assert.AreEqual("<a href=\"Seguimientos?imei=123456789912345\">123456789912345</a>", celularViewModel.ImeiLink);
            Assert.AreEqual(celular.Marca.Nombre, celularViewModel.Operador);
            Assert.AreEqual(celular.Descripcion, celularViewModel.Producto);
            Assert.AreEqual(celular.FechaIngreso.ToString("yyyy-MM-dd"), celularViewModel.Ingreso);
            Assert.AreEqual("<a href=\"#\" onclick=\"sendImeiDialog(10)\">Envio</a>", celularViewModel.Comandos);

            var lastSeguimiento = celular.Seguimientos.ElementAt(1);

            Assert.AreEqual(lastSeguimiento.Comprobante, celularViewModel.Comprobante);
            Assert.AreEqual(ModelHelper.ToString(lastSeguimiento.Estado), celularViewModel.Estado);
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Nombre));
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Codigo));

            principalMock.VerifyAll();
        }

        [TestMethod]
        public void ShouldSetNoCommandsForDespachanteWhenEstadoIsDisponibleVentaAndItIsNotInHisSucursal()
        {
            var date = DateTime.Today;
            var lastSucursal = new Sucursal { Nombre = "Suc3", Codigo = "Cod3" };
            var sucursalRole = string.Concat(lastSucursal.Nombre, Constants.SucursalRoleSuffix);

            var celular = new Celular { Id = 10, Descripcion = "Description", Imei = 123456789912345, FechaIngreso = date, Marca = new Marca { EsOperador = true, Nombre = "Personal" } };
            celular.Seguimientos.Add(new Seguimiento { Id = 1, Estado = Estado.Dañado, Fecha = date, Comprobante = "123-456", Sucursal = new Sucursal { Nombre = "Suc1", Codigo = "Cod1" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 3, Estado = Estado.DisponibleVenta, Fecha = date.AddDays(1), Comprobante = "654-321", Sucursal = lastSucursal });
            celular.Seguimientos.Add(new Seguimiento { Id = 2, Estado = Estado.Pendiente, Fecha = date.AddDays(1), Comprobante = "321-654", Sucursal = new Sucursal { Nombre = "Suc2", Codigo = "Cod2" } });

            var principalMock = new Mock<IPrincipal>(MockBehavior.Strict);
            principalMock.Setup(p => p.IsInRole(Constants.AdministradorRole)).Returns(false);
            principalMock.Setup(p => p.IsInRole(Constants.DespachanteRole)).Returns(true);
            principalMock.Setup(p => p.IsInRole(Constants.VendedorRole)).Returns(false);
            principalMock.Setup(p => p.IsInRole(sucursalRole)).Returns(false);

            var celularViewModel = new CelularViewModel(celular, principalMock.Object);

            Assert.AreEqual(celular.Id, celularViewModel.Id);
            Assert.AreEqual(celular.Imei, celularViewModel.Imei);
            Assert.AreEqual("<a href=\"Seguimientos?imei=123456789912345\">123456789912345</a>", celularViewModel.ImeiLink);
            Assert.AreEqual(celular.Marca.Nombre, celularViewModel.Operador);
            Assert.AreEqual(celular.Descripcion, celularViewModel.Producto);
            Assert.AreEqual(celular.FechaIngreso.ToString("yyyy-MM-dd"), celularViewModel.Ingreso);
            Assert.AreEqual(string.Empty, celularViewModel.Comandos);

            var lastSeguimiento = celular.Seguimientos.ElementAt(1);

            Assert.AreEqual(lastSeguimiento.Comprobante, celularViewModel.Comprobante);
            Assert.AreEqual(ModelHelper.ToString(lastSeguimiento.Estado), celularViewModel.Estado);
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Nombre));
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Codigo));

            principalMock.VerifyAll();
        }

        [TestMethod]
        public void ShouldSetTheCorrectCommandsForVendedorWhenEstadoIsDisponibleVenta()
        {
            var date = DateTime.Today;
            var lastSucursal = new Sucursal { Nombre = "Suc3", Codigo = "Cod3" };
            var sucursalRole = string.Concat(lastSucursal.Nombre, Constants.SucursalRoleSuffix);

            var celular = new Celular { Id = 10, Descripcion = "Description", Imei = 123456789912345, FechaIngreso = date, Marca = new Marca { EsOperador = true, Nombre = "Personal" } };
            celular.Seguimientos.Add(new Seguimiento { Id = 1, Estado = Estado.Dañado, Fecha = date, Comprobante = "123-456", Sucursal = new Sucursal { Nombre = "Suc1", Codigo = "Cod1" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 3, Estado = Estado.DisponibleVenta, Fecha = date.AddDays(1), Comprobante = "654-321", Sucursal = lastSucursal });
            celular.Seguimientos.Add(new Seguimiento { Id = 2, Estado = Estado.Pendiente, Fecha = date.AddDays(1), Comprobante = "321-654", Sucursal = new Sucursal { Nombre = "Suc2", Codigo = "Cod2" } });

            var principalMock = new Mock<IPrincipal>(MockBehavior.Strict);
            principalMock.Setup(p => p.IsInRole(Constants.AdministradorRole)).Returns(false);
            principalMock.Setup(p => p.IsInRole(Constants.DespachanteRole)).Returns(false);
            principalMock.Setup(p => p.IsInRole(Constants.VendedorRole)).Returns(true);
            principalMock.Setup(p => p.IsInRole(sucursalRole)).Returns(true);

            var celularViewModel = new CelularViewModel(celular, principalMock.Object);

            Assert.AreEqual(celular.Id, celularViewModel.Id);
            Assert.AreEqual(celular.Imei, celularViewModel.Imei);
            Assert.AreEqual("<a href=\"Seguimientos?imei=123456789912345\">123456789912345</a>", celularViewModel.ImeiLink);
            Assert.AreEqual(celular.Marca.Nombre, celularViewModel.Operador);
            Assert.AreEqual(celular.Descripcion, celularViewModel.Producto);
            Assert.AreEqual(celular.FechaIngreso.ToString("yyyy-MM-dd"), celularViewModel.Ingreso);
            Assert.AreEqual("<a href=\"#\" onclick=\"sellImeiDialog(10)\">Venta</a>", celularViewModel.Comandos);

            var lastSeguimiento = celular.Seguimientos.ElementAt(1);

            Assert.AreEqual(lastSeguimiento.Comprobante, celularViewModel.Comprobante);
            Assert.AreEqual(ModelHelper.ToString(lastSeguimiento.Estado), celularViewModel.Estado);
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Nombre));
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Codigo));

            principalMock.VerifyAll();
        }

        [TestMethod]
        public void ShouldSetNoCommandsForVendedorWhenEstadoIsDisponibleVentaAndItIsNotInHisSucursal()
        {
            var date = DateTime.Today;
            var lastSucursal = new Sucursal { Nombre = "Suc3", Codigo = "Cod3" };
            var sucursalRole = string.Concat(lastSucursal.Nombre, Constants.SucursalRoleSuffix);

            var celular = new Celular { Id = 10, Descripcion = "Description", Imei = 123456789912345, FechaIngreso = date, Marca = new Marca { EsOperador = true, Nombre = "Personal" } };
            celular.Seguimientos.Add(new Seguimiento { Id = 1, Estado = Estado.Dañado, Fecha = date, Comprobante = "123-456", Sucursal = new Sucursal { Nombre = "Suc1", Codigo = "Cod1" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 3, Estado = Estado.DisponibleVenta, Fecha = date.AddDays(1), Comprobante = "654-321", Sucursal = lastSucursal });
            celular.Seguimientos.Add(new Seguimiento { Id = 2, Estado = Estado.Pendiente, Fecha = date.AddDays(1), Comprobante = "321-654", Sucursal = new Sucursal { Nombre = "Suc2", Codigo = "Cod2" } });

            var principalMock = new Mock<IPrincipal>(MockBehavior.Strict);
            principalMock.Setup(p => p.IsInRole(Constants.AdministradorRole)).Returns(false);
            principalMock.Setup(p => p.IsInRole(Constants.DespachanteRole)).Returns(false);
            principalMock.Setup(p => p.IsInRole(Constants.VendedorRole)).Returns(true);
            principalMock.Setup(p => p.IsInRole(sucursalRole)).Returns(false);

            var celularViewModel = new CelularViewModel(celular, principalMock.Object);

            Assert.AreEqual(celular.Id, celularViewModel.Id);
            Assert.AreEqual(celular.Imei, celularViewModel.Imei);
            Assert.AreEqual("<a href=\"Seguimientos?imei=123456789912345\">123456789912345</a>", celularViewModel.ImeiLink);
            Assert.AreEqual(celular.Marca.Nombre, celularViewModel.Operador);
            Assert.AreEqual(celular.Descripcion, celularViewModel.Producto);
            Assert.AreEqual(celular.FechaIngreso.ToString("yyyy-MM-dd"), celularViewModel.Ingreso);
            Assert.AreEqual(string.Empty, celularViewModel.Comandos);

            var lastSeguimiento = celular.Seguimientos.ElementAt(1);

            Assert.AreEqual(lastSeguimiento.Comprobante, celularViewModel.Comprobante);
            Assert.AreEqual(ModelHelper.ToString(lastSeguimiento.Estado), celularViewModel.Estado);
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Nombre));
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Codigo));

            principalMock.VerifyAll();
        }

        [TestMethod]
        public void ShouldSetTheCorrectCommandsForAdministratorWhenEstadoIsVendido()
        {
            var date = DateTime.Today;

            var celular = new Celular { Id = 10, Descripcion = "Description", Imei = 123456789912345, FechaIngreso = date, Marca = new Marca { EsOperador = true, Nombre = "Personal" } };
            celular.Seguimientos.Add(new Seguimiento { Id = 1, Estado = Estado.Dañado, Fecha = date, Comprobante = "123-456", Sucursal = new Sucursal { Nombre = "Suc1", Codigo = "Cod1" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 3, Estado = Estado.Vendido, Fecha = date.AddDays(1), Comprobante = "654-321", Sucursal = new Sucursal { Nombre = "Suc3", Codigo = "Cod3" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 2, Estado = Estado.Pendiente, Fecha = date.AddDays(1), Comprobante = "321-654", Sucursal = new Sucursal { Nombre = "Suc2", Codigo = "Cod2" } });

            var principalMock = new Mock<IPrincipal>(MockBehavior.Strict);
            principalMock.Setup(p => p.IsInRole(Constants.AdministradorRole)).Returns(true);

            var celularViewModel = new CelularViewModel(celular, principalMock.Object);

            Assert.AreEqual(celular.Id, celularViewModel.Id);
            Assert.AreEqual(celular.Imei, celularViewModel.Imei);
            Assert.AreEqual("<a href=\"Seguimientos?imei=123456789912345\">123456789912345</a>", celularViewModel.ImeiLink);
            Assert.AreEqual(celular.Marca.Nombre, celularViewModel.Operador);
            Assert.AreEqual(celular.Descripcion, celularViewModel.Producto);
            Assert.AreEqual(celular.FechaIngreso.ToString("yyyy-MM-dd"), celularViewModel.Ingreso);
            Assert.AreEqual("<a href=\"#\" onclick=\"returnImeiDialog(10)\">Devolucion</a>", celularViewModel.Comandos);

            var lastSeguimiento = celular.Seguimientos.ElementAt(1);

            Assert.AreEqual(lastSeguimiento.Comprobante, celularViewModel.Comprobante);
            Assert.AreEqual(ModelHelper.ToString(lastSeguimiento.Estado), celularViewModel.Estado);
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Nombre));
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Codigo));

            principalMock.VerifyAll();
        }

        [TestMethod]
        public void ShouldSetTheCorrectCommandsForVendedorWhenEstadoIsVendido()
        {
            var date = DateTime.Today;
            var lastSucursal = new Sucursal { Nombre = "Suc3", Codigo = "Cod3" };
            var sucursalRole = string.Concat(lastSucursal.Nombre, Constants.SucursalRoleSuffix);

            var celular = new Celular { Id = 10, Descripcion = "Description", Imei = 123456789912345, FechaIngreso = date, Marca = new Marca { EsOperador = true, Nombre = "Personal" } };
            celular.Seguimientos.Add(new Seguimiento { Id = 1, Estado = Estado.Dañado, Fecha = date, Comprobante = "123-456", Sucursal = new Sucursal { Nombre = "Suc1", Codigo = "Cod1" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 3, Estado = Estado.Vendido, Fecha = date.AddDays(1), Comprobante = "654-321", Sucursal = lastSucursal });
            celular.Seguimientos.Add(new Seguimiento { Id = 2, Estado = Estado.Pendiente, Fecha = date.AddDays(1), Comprobante = "321-654", Sucursal = new Sucursal { Nombre = "Suc2", Codigo = "Cod2" } });

            var principalMock = new Mock<IPrincipal>(MockBehavior.Strict);
            principalMock.Setup(p => p.IsInRole(Constants.AdministradorRole)).Returns(false);
            principalMock.Setup(p => p.IsInRole(Constants.VendedorRole)).Returns(true);
            principalMock.Setup(p => p.IsInRole(sucursalRole)).Returns(true);

            var celularViewModel = new CelularViewModel(celular, principalMock.Object);

            Assert.AreEqual(celular.Id, celularViewModel.Id);
            Assert.AreEqual(celular.Imei, celularViewModel.Imei);
            Assert.AreEqual("<a href=\"Seguimientos?imei=123456789912345\">123456789912345</a>", celularViewModel.ImeiLink);
            Assert.AreEqual(celular.Marca.Nombre, celularViewModel.Operador);
            Assert.AreEqual(celular.Descripcion, celularViewModel.Producto);
            Assert.AreEqual(celular.FechaIngreso.ToString("yyyy-MM-dd"), celularViewModel.Ingreso);
            Assert.AreEqual("<a href=\"#\" onclick=\"returnImeiDialog(10)\">Devolucion</a>", celularViewModel.Comandos);

            var lastSeguimiento = celular.Seguimientos.ElementAt(1);

            Assert.AreEqual(lastSeguimiento.Comprobante, celularViewModel.Comprobante);
            Assert.AreEqual(ModelHelper.ToString(lastSeguimiento.Estado), celularViewModel.Estado);
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Nombre));
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Codigo));

            principalMock.VerifyAll();
        }

        [TestMethod]
        public void ShouldSetNoCommandsForVendedorWhenEstadoIsVendidoAndItIsNotInHisSucursal()
        {
            var date = DateTime.Today;
            var lastSucursal = new Sucursal { Nombre = "Suc3", Codigo = "Cod3" };
            var sucursalRole = string.Concat(lastSucursal.Nombre, Constants.SucursalRoleSuffix);

            var celular = new Celular { Id = 10, Descripcion = "Description", Imei = 123456789912345, FechaIngreso = date, Marca = new Marca { EsOperador = true, Nombre = "Personal" } };
            celular.Seguimientos.Add(new Seguimiento { Id = 1, Estado = Estado.Dañado, Fecha = date, Comprobante = "123-456", Sucursal = new Sucursal { Nombre = "Suc1", Codigo = "Cod1" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 3, Estado = Estado.Vendido, Fecha = date.AddDays(1), Comprobante = "654-321", Sucursal = lastSucursal });
            celular.Seguimientos.Add(new Seguimiento { Id = 2, Estado = Estado.Pendiente, Fecha = date.AddDays(1), Comprobante = "321-654", Sucursal = new Sucursal { Nombre = "Suc2", Codigo = "Cod2" } });

            var principalMock = new Mock<IPrincipal>(MockBehavior.Strict);
            principalMock.Setup(p => p.IsInRole(Constants.AdministradorRole)).Returns(false);
            principalMock.Setup(p => p.IsInRole(Constants.VendedorRole)).Returns(true);
            principalMock.Setup(p => p.IsInRole(sucursalRole)).Returns(false);

            var celularViewModel = new CelularViewModel(celular, principalMock.Object);

            Assert.AreEqual(celular.Id, celularViewModel.Id);
            Assert.AreEqual(celular.Imei, celularViewModel.Imei);
            Assert.AreEqual("<a href=\"Seguimientos?imei=123456789912345\">123456789912345</a>", celularViewModel.ImeiLink);
            Assert.AreEqual(celular.Marca.Nombre, celularViewModel.Operador);
            Assert.AreEqual(celular.Descripcion, celularViewModel.Producto);
            Assert.AreEqual(celular.FechaIngreso.ToString("yyyy-MM-dd"), celularViewModel.Ingreso);
            Assert.AreEqual(string.Empty, celularViewModel.Comandos);

            var lastSeguimiento = celular.Seguimientos.ElementAt(1);

            Assert.AreEqual(lastSeguimiento.Comprobante, celularViewModel.Comprobante);
            Assert.AreEqual(ModelHelper.ToString(lastSeguimiento.Estado), celularViewModel.Estado);
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Nombre));
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Codigo));

            principalMock.VerifyAll();
        }

        [TestMethod]
        public void ShouldSetNoCommandsWhenEstadoIsVendido()
        {
            var date = DateTime.Today;

            var celular = new Celular { Id = 10, Descripcion = "Description", Imei = 123456789912345, FechaIngreso = date, Marca = new Marca { EsOperador = true, Nombre = "Personal" } };
            celular.Seguimientos.Add(new Seguimiento { Id = 1, Estado = Estado.Dañado, Fecha = date, Comprobante = "123-456", Sucursal = new Sucursal { Nombre = "Suc1", Codigo = "Cod1" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 3, Estado = Estado.Vendido, Fecha = date.AddDays(1), Comprobante = "654-321", Sucursal = new Sucursal { Nombre = "Suc3", Codigo = "Cod3" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 2, Estado = Estado.Pendiente, Fecha = date.AddDays(1), Comprobante = "321-654", Sucursal = new Sucursal { Nombre = "Suc2", Codigo = "Cod2" } });

            var principalMock = new Mock<IPrincipal>(MockBehavior.Strict);
            principalMock.Setup(p => p.IsInRole(Constants.AdministradorRole)).Returns(false);
            principalMock.Setup(p => p.IsInRole(Constants.VendedorRole)).Returns(false);

            var celularViewModel = new CelularViewModel(celular, principalMock.Object);

            Assert.AreEqual(celular.Id, celularViewModel.Id);
            Assert.AreEqual(celular.Imei, celularViewModel.Imei);
            Assert.AreEqual("<a href=\"Seguimientos?imei=123456789912345\">123456789912345</a>", celularViewModel.ImeiLink);
            Assert.AreEqual(celular.Marca.Nombre, celularViewModel.Operador);
            Assert.AreEqual(celular.Descripcion, celularViewModel.Producto);
            Assert.AreEqual(celular.FechaIngreso.ToString("yyyy-MM-dd"), celularViewModel.Ingreso);
            Assert.AreEqual(string.Empty, celularViewModel.Comandos);

            var lastSeguimiento = celular.Seguimientos.ElementAt(1);

            Assert.AreEqual(lastSeguimiento.Comprobante, celularViewModel.Comprobante);
            Assert.AreEqual(ModelHelper.ToString(lastSeguimiento.Estado), celularViewModel.Estado);
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Nombre));
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Codigo));

            principalMock.VerifyAll();
        }

        [TestMethod]
        public void ShouldSetNoCommandsWhenEstadoIsDañado()
        {
            var date = DateTime.Today;
            var celular = new Celular { Id = 10, Descripcion = "Description", Imei = 123456789912345, FechaIngreso = date, Marca = new Marca { EsOperador = true, Nombre = "Personal" } };
            celular.Seguimientos.Add(new Seguimiento { Id = 1, Estado = Estado.Dañado, Fecha = date, Comprobante = "123-456", Sucursal = new Sucursal { Nombre = "Suc1", Codigo = "Cod1" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 3, Estado = Estado.Dañado, Fecha = date.AddDays(1), Comprobante = "654-321", Sucursal = new Sucursal { Nombre = "Suc3", Codigo = "Cod3" } });
            celular.Seguimientos.Add(new Seguimiento { Id = 2, Estado = Estado.Pendiente, Fecha = date.AddDays(1), Comprobante = "321-654", Sucursal = new Sucursal { Nombre = "Suc2", Codigo = "Cod2" } });

            var celularViewModel = new CelularViewModel(celular, new Mock<IPrincipal>().Object);

            Assert.AreEqual(celular.Id, celularViewModel.Id);
            Assert.AreEqual(celular.Imei, celularViewModel.Imei);
            Assert.AreEqual("<a href=\"Seguimientos?imei=123456789912345\">123456789912345</a>", celularViewModel.ImeiLink);
            Assert.AreEqual(celular.Marca.Nombre, celularViewModel.Operador);
            Assert.AreEqual(celular.Descripcion, celularViewModel.Producto);
            Assert.AreEqual(celular.FechaIngreso.ToString("yyyy-MM-dd"), celularViewModel.Ingreso);
            Assert.AreEqual(string.Empty, celularViewModel.Comandos);

            var lastSeguimiento = celular.Seguimientos.ElementAt(1);

            Assert.AreEqual(lastSeguimiento.Comprobante, celularViewModel.Comprobante);
            Assert.AreEqual(ModelHelper.ToString(lastSeguimiento.Estado), celularViewModel.Estado);
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Nombre));
            Assert.IsTrue(celularViewModel.Ubicacion.Contains(lastSeguimiento.Sucursal.Codigo));
        }
    }
}
